// inimanager.cpp

#include "inimanager.h"
#include <QSettings>
#include <QDebug>
#include <QRegExp>

// 构造函数，初始化iniManager对象
iniManager::iniManager(const QString &filePath, QObject *parent)
    : QObject(parent),
    m_filePath(filePath),
    m_settings(nullptr)
{
    // 初始化QSettings对象
    initSettings();
}

// 析构函数，释放QSettings对象
iniManager::~iniManager()
{
    if (m_settings) {
        delete m_settings;
    }
}

// 初始化QSettings对象
void iniManager::initSettings()
{
    // 检查QSettings对象是否已经存在
    if (!m_settings) {
        m_settings = new QSettings(m_filePath, QSettings::IniFormat);
    }
}

// 读取指定组和键的值
QVariant iniManager::readValue(const QString &group, const QString &key, const QVariant &defaultValue) const
{
    m_settings->beginGroup(group); // 开始指定组
    QVariant value = m_settings->value(key, defaultValue); // 读取键的值，如果不存在则返回默认值
    m_settings->endGroup(); // 结束指定组
    return value;
}

// 写入指定组和键的值
bool iniManager::writeValue(const QString &group, const QString &key, const QVariant &value)
{
    m_settings->beginGroup(group); // 开始指定组
    m_settings->setValue(key, value); // 设置键的值
    m_settings->endGroup(); // 结束指定组
    return true;
}

// 添加新的组和键值对
bool iniManager::addGroup(const QString &group, const QVariantMap &keyValues)
{
    return writeValues(group, keyValues); // 调用writeValues函数写入多个键值对
}

// 删除指定的组
bool iniManager::removeGroup(const QString &group)
{
    m_settings->beginGroup(group); // 开始指定组
    m_settings->remove(""); // 删除组中的所有键值对
    m_settings->endGroup(); // 结束指定组
    return true;
}

// 删除指定组中的某个键
bool iniManager::removeValue(const QString &group, const QString &key)
{
    m_settings->beginGroup(group); // 开始指定组
    m_settings->remove(key); // 删除指定的键
    m_settings->endGroup(); // 结束指定组
    return true;
}

// 获取所有的组名
QStringList iniManager::allGroups() const
{
    return m_settings->childGroups(); // 返回所有组名
}

// 获取指定组中的所有键
QStringList iniManager::allKeys(const QString &group) const
{
    m_settings->beginGroup(group); // 开始指定组
    QStringList keys = m_settings->childKeys(); // 获取组中的所有键
    m_settings->endGroup(); // 结束指定组
    return keys;
}

// 分割字符串，验证格式并返回各部分
QStringList iniManager::splitString(const QString &input) {
    QRegExp regex(R"(^(\d+)_([\d]+)_([\d]+)_([\d]+)_(K|Z)$)");

    // 检查字符串格式是否匹配
    if (!regex.exactMatch(input)) {
        qWarning() << "工作组编号，格式不正确!";
        return QStringList();
    }

    QStringList parts = input.split('_');

    // 检查分割后的部分数量
    if (parts.size() != 5) {
        qWarning() << "分裂后超出数量!";
        return QStringList();
    }

    QString category = parts.last();
    // 验证最后一个部分是否为 'K' 或 'Z'
    if (category != "K" && category != "Z") {
        qWarning() << "无效，类型必须是 'K' 或 'Z'.";
        return QStringList();
    }

    return parts;
}

// 生成组ID字符串
QString iniManager::getGroupIdQString(const uint16_t id, const uint16_t l, const uint16_t w, const uint16_t h, const QString type)
{
    // 验证类型是否为 'K' 或 'Z'
    if (type != "K" && type != "Z") {
        qWarning() << "无效，类型必须是 'K' 或 'Z'.";
        return "";
    }

    // 返回格式化的组ID字符串
    return QString("%1_%2_%3_%4_%5").arg(id).arg(l).arg(w).arg(h).arg(type);
}

// 获取组类型的字符串表示
QString iniManager::getGroupType(const QString &type)
{
    if (type == "K") return "宽";
    if (type == "Z") return "窄";
    if (type == "宽") return "K";
    if (type == "窄") return "Z";
    return QString();
}

// 根据宽度和长度获取组类型
QString iniManager::getGroupType(const uint16_t &w, const uint16_t &l)
{
    if(w < 450 || l < 450) return "窄";
    else return "宽";
}

// 检查是否存在指定键和值的匹配
bool iniManager::isExists(const QString &key, const QVariant &value) const
{
    QStringList groups = allGroups();

    for (const QString &group : groups) {
        if (readValue(group, key) == value) {
            return true;
        }
    }
    return false;
}

// 获取包含指定键和值的组
QString iniManager::getGroup(const QString &key, const QVariant &value) const
{
    QStringList groups = allGroups();

    for (const QString &group : groups) {
        if (readValue(group, key) == value) {
            return group;
        }
    }
    return QString();
}

// 写入多个键值对到指定组
bool iniManager::writeValues(const QString &group, const QVariantMap &keyValues)
{
    m_settings->beginGroup(group); // 开始指定组
    for (auto it = keyValues.constBegin(); it != keyValues.constEnd(); ++it) {
        m_settings->setValue(it.key(), it.value()); // 设置键值对
    }
    m_settings->endGroup(); // 结束指定组
    return true;
}

// 同步设置到存储
bool iniManager::sync()
{
    m_settings->sync(); // 同步数据到存储
    return (m_settings->status() == QSettings::NoError); // 检查同步是否成功
}
